design distributed cache